{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "initial_id",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    ""
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 1、LLMChain的使用\n",
    "\n",
    "举例1："
   ],
   "id": "f2e17274d6907f79"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:22:17.691750Z",
     "start_time": "2025-09-29T01:22:14.315491Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from modulefinder import replacePackageMap\n",
    "\n",
    "from langchain.chains.llm import LLMChain\n",
    "from langchain.chains.sequential import SimpleSequentialChain\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "\n",
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv(\"OPENAI_API_KEY1\")\n",
    "os.environ['OPENAI_BASE_URL'] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "# 1、创建大模型实例\n",
    "chat_model = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 2、提供提示词模板\n",
    "# BasePromptTemplate的典型子类有：PrompTemplate、ChatPromptTemplate\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    template=\"你是一个数学高手，帮我解决如下的数学问题：{question}\"\n",
    ")\n",
    "\n",
    "chain = LLMChain(llm=chat_model,prompt=prompt_template)\n",
    "response = chain.invoke(input={\"question\": \"1 + 2 * 3 = ?\"})\n",
    "print(response)"
   ],
   "id": "73954070391e1f82",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/miniconda3/envs/pyth310/lib/python3.10/site-packages/requests/__init__.py:86: RequestsDependencyWarning: Unable to find acceptable character detection dependency (chardet or charset_normalizer).\n",
      "  warnings.warn(\n",
      "/var/folders/9p/r71fhhs11052m2r7x4gfc5b80000gn/T/ipykernel_49938/1720984369.py:25: LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 1.0. Use :meth:`~RunnableSequence, e.g., `prompt | llm`` instead.\n",
      "  chain = LLMChain(llm=chat_model,prompt=prompt_template)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'question': '1 + 2 * 3 = ?', 'text': '根据数学运算的优先级，乘法的优先级高于加法。因此，我们首先计算 \\\\(2 * 3\\\\)：\\n\\n\\\\[ \\n2 * 3 = 6 \\n\\\\]\\n\\n然后再进行加法：\\n\\n\\\\[ \\n1 + 6 = 7 \\n\\\\]\\n\\n所以，\\\\(1 + 2 * 3 = 7\\\\)。'}\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "举例2：使用ChatPromptTemplate及参数verbose的演示",
   "id": "9802e4a8d8f9be13"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:23:10.098962Z",
     "start_time": "2025-09-29T01:23:08.724599Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from langchain.chains.llm import LLMChain\n",
    "from langchain_core.prompts import PromptTemplate, ChatPromptTemplate\n",
    "\n",
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv(\"OPENAI_API_KEY1\")\n",
    "os.environ['OPENAI_BASE_URL'] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "# 1、创建大模型实例\n",
    "chat_model = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 2、提供提示词模板\n",
    "# BasePromptTemplate的典型子类有：PrompTemplate、ChatPromptTemplate\n",
    "prompt_template = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"你是一个数学高手\"),\n",
    "    (\"human\", \"帮我解决如下的数学问题：{question}\")\n",
    "\n",
    "])\n",
    "\n",
    "chain = LLMChain(\n",
    "    llm=chat_model,\n",
    "    prompt=prompt_template,\n",
    "    verbose=True,  #显式执行过程中的详细日志情况\n",
    ")\n",
    "response = chain.invoke(input={\"question\": \"1 + 2 * 3 = ?\"})\n",
    "print(response)"
   ],
   "id": "50ebcc38879832c9",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一个数学高手\n",
      "Human: 帮我解决如下的数学问题：1 + 2 * 3 = ?\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'question': '1 + 2 * 3 = ?', 'text': '根据数学运算的优先级，乘法运算优先于加法运算。因此，首先计算乘法部分：\\n\\n2 * 3 = 6\\n\\n然后将结果加上1：\\n\\n1 + 6 = 7\\n\\n所以，1 + 2 * 3 = 7。'}\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 2、顺序链之SimpleSequentialChain的使用\n",
    "\n",
    "举例1："
   ],
   "id": "3edb82701dae24b0"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:28:44.900586Z",
     "start_time": "2025-09-29T01:28:44.892867Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain.chains import LLMChain\n",
    "\n",
    "chainA_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你是一位精通各领域知识的知名教授\"),\n",
    "        (\"human\", \"请你尽可能详细的解释一下：{knowledge}\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "chat_model = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "chainA_chains = LLMChain(llm=chat_model,\n",
    "                         prompt=chainA_template,\n",
    "                         verbose=True\n",
    "                         )\n",
    "\n",
    "\n",
    "\n",
    "# chainA_chains.invoke({\"knowledge\":\"什么是LangChain？\"})"
   ],
   "id": "74a6267d42118aff",
   "outputs": [],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:28:47.742155Z",
     "start_time": "2025-09-29T01:28:47.736052Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "\n",
    "chainB_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你非常善于提取文本中的重要信息，并做出简短的总结\"),\n",
    "        (\"human\", \"这是针对一个提问的完整的解释说明内容：{description}\"),\n",
    "        (\"human\", \"请你根据上述说明，尽可能简短的输出重要的结论，请控制在20个字以内\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "chainB_chains = LLMChain(llm=chat_model,\n",
    "                         prompt=chainB_template,\n",
    "                         verbose=True\n",
    "                         )"
   ],
   "id": "3de5dfd65a8981dc",
   "outputs": [],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:31:24.814199Z",
     "start_time": "2025-09-29T01:31:19.076814Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from langchain.chains.sequential import SimpleSequentialChain\n",
    "\n",
    "full_chain = SimpleSequentialChain(\n",
    "    chains=[chainA_chains,chainB_chains],\n",
    "    verbose=True\n",
    ")\n",
    "\n",
    "#说明：针对于SimpleSequentialChain而言，唯一的输入的变量名是：input\n",
    "response = full_chain.invoke(input={\"input\": \"什么是LangChain?\"})\n",
    "print(response)"
   ],
   "id": "d51fb2627c4b389",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一位精通各领域知识的知名教授\n",
      "Human: 请你尽可能详细的解释一下：什么是LangChain?\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3mLangChain 是一个用于构建基于语言模型的应用程序的框架，它旨在帮助开发者更容易地创建复杂的应用，而不需要深入了解整个模型的内部机制。LangChain 为处理自然语言任务提供了一系列工具和实现，包括与大型语言模型（如 OpenAI 的 GPT 系列）的交互、链式调用、上下文管理等功能。\n",
      "\n",
      "### LangChain 的核心组成部分\n",
      "\n",
      "1. **语言模型接口**：\n",
      "   LangChain 提供了一个抽象层，可以与不同的语言模型进行交互，包括 OpenAI、Hugging Face 的 Transformers、Anthropic 等。这使得开发者可以轻松切换不同的后端语言模型，同时保持应用的核心逻辑不变。\n",
      "\n",
      "2. **链**：\n",
      "   LangChain 的一个重要概念是“链”。链是指将多个处理步骤（比如多个语言模型调用、数据处理、条件判断等）串联在一起，以便实现更复杂的逻辑。开发者可以通过定义链来控制数据如何在不同的步骤之间流动。\n",
      "\n",
      "3. **提示（Prompt）管理**：\n",
      "   LangChain 提供了提示模板的管理功能，以便于生成对语言模型的呼叫。开发者可以创建、修改和组合提示，帮助更好地引导模型生成所需的结果。\n",
      "\n",
      "4. **上下文管理**：\n",
      "   LangChain 提供了工具来管理与用户交互的上下文。这对于需要保持状态或会话历史的应用程序尤为重要，使得模型能够理解并基于之前的对话上下文生成合适的回复。\n",
      "\n",
      "5. **数据连接**：\n",
      "   LangChain 支持与外部数据源的连接，如数据库、APIs、文件系统等。这使得语言模型能够访问和使用实时数据，以便生成更准确和相关的响应。\n",
      "\n",
      "### LangChain 的应用场景\n",
      "\n",
      "LangChain 可以用于多种语言生成和处理任务，以下是一些常见的应用场景：\n",
      "\n",
      "- **聊天机器人**：构建能够与用户进行自然对话的聊天机器人。\n",
      "- **自动内容生成**：生成文章、报告、社交媒体帖子等。\n",
      "- **问答系统**：构建根据用户查询从知识库中提取答案的系统。\n",
      "- **文本分析和处理**：对文本进行分析、总结、分类等操作。\n",
      "\n",
      "### 总结\n",
      "\n",
      "LangChain 是一个强大的工具，使得开发者能够轻松创建各种基于语言模型的应用程序。通过模块化的设计和灵活的架构，LangChain 降低了使用复杂的自然语言处理技术的门槛，使得更多人能够利用先进的语言模型来解决实际问题。这极大地推动了NLP技术的应用和普及。\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你非常善于提取文本中的重要信息，并做出简短的总结\n",
      "Human: 这是针对一个提问的完整的解释说明内容：LangChain 是一个用于构建基于语言模型的应用程序的框架，它旨在帮助开发者更容易地创建复杂的应用，而不需要深入了解整个模型的内部机制。LangChain 为处理自然语言任务提供了一系列工具和实现，包括与大型语言模型（如 OpenAI 的 GPT 系列）的交互、链式调用、上下文管理等功能。\n",
      "\n",
      "### LangChain 的核心组成部分\n",
      "\n",
      "1. **语言模型接口**：\n",
      "   LangChain 提供了一个抽象层，可以与不同的语言模型进行交互，包括 OpenAI、Hugging Face 的 Transformers、Anthropic 等。这使得开发者可以轻松切换不同的后端语言模型，同时保持应用的核心逻辑不变。\n",
      "\n",
      "2. **链**：\n",
      "   LangChain 的一个重要概念是“链”。链是指将多个处理步骤（比如多个语言模型调用、数据处理、条件判断等）串联在一起，以便实现更复杂的逻辑。开发者可以通过定义链来控制数据如何在不同的步骤之间流动。\n",
      "\n",
      "3. **提示（Prompt）管理**：\n",
      "   LangChain 提供了提示模板的管理功能，以便于生成对语言模型的呼叫。开发者可以创建、修改和组合提示，帮助更好地引导模型生成所需的结果。\n",
      "\n",
      "4. **上下文管理**：\n",
      "   LangChain 提供了工具来管理与用户交互的上下文。这对于需要保持状态或会话历史的应用程序尤为重要，使得模型能够理解并基于之前的对话上下文生成合适的回复。\n",
      "\n",
      "5. **数据连接**：\n",
      "   LangChain 支持与外部数据源的连接，如数据库、APIs、文件系统等。这使得语言模型能够访问和使用实时数据，以便生成更准确和相关的响应。\n",
      "\n",
      "### LangChain 的应用场景\n",
      "\n",
      "LangChain 可以用于多种语言生成和处理任务，以下是一些常见的应用场景：\n",
      "\n",
      "- **聊天机器人**：构建能够与用户进行自然对话的聊天机器人。\n",
      "- **自动内容生成**：生成文章、报告、社交媒体帖子等。\n",
      "- **问答系统**：构建根据用户查询从知识库中提取答案的系统。\n",
      "- **文本分析和处理**：对文本进行分析、总结、分类等操作。\n",
      "\n",
      "### 总结\n",
      "\n",
      "LangChain 是一个强大的工具，使得开发者能够轻松创建各种基于语言模型的应用程序。通过模块化的设计和灵活的架构，LangChain 降低了使用复杂的自然语言处理技术的门槛，使得更多人能够利用先进的语言模型来解决实际问题。这极大地推动了NLP技术的应用和普及。\n",
      "Human: 请你根据上述说明，尽可能简短的输出重要的结论，请控制在20个字以内\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3mLangChain 简化了基于语言模型的应用开发，支持多种自然语言处理任务。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'input': '什么是LangChain?', 'output': 'LangChain 简化了基于语言模型的应用开发，支持多种自然语言处理任务。'}\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "举例2：",
   "id": "6622a221caf6b7be"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:33:21.574346Z",
     "start_time": "2025-09-29T01:33:08.137488Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# 1.导入相关包\n",
    "from langchain.chains import LLMChain\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain.chains import SimpleSequentialChain\n",
    "\n",
    "# 2.创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 3.定义一个给剧名写大纲的LLMChain\n",
    "template1 = \"\"\"你是个剧作家。给定剧本的标题，你的工作就是为这个标题写一个大纲。\n",
    "Title: {title}\n",
    "\"\"\"\n",
    "prompt_template1 = PromptTemplate(input_variables=[\"title\"], template=template1)\n",
    "synopsis_chain = LLMChain(llm=llm, prompt=prompt_template1)\n",
    "\n",
    "# 4.定义给一个剧本大纲写一篇评论的LLMChain\n",
    "template2 = \"\"\"你是《纽约时报》的剧评家。有了剧本的大纲，你的工作就是为剧本写一篇评论\n",
    "剧情大纲:\n",
    "{synopsis}\n",
    "\"\"\"\n",
    "prompt_template2 = PromptTemplate(input_variables=[\"synopsis\"], template=template2)\n",
    "review_chain = LLMChain(llm=llm, prompt=prompt_template2)\n",
    "\n",
    "\n",
    "# 5.定义一个完整的链按顺序运行这两条链\n",
    "#(verbose=True:打印链的执行过程)\n",
    "overall_chain = SimpleSequentialChain(\n",
    "    chains=[synopsis_chain, review_chain],\n",
    "    verbose=True\n",
    ")\n",
    "# 6.调用完整链顺序执行这两个链\n",
    "review = overall_chain.invoke({\"input\":\"日落海滩上的悲剧\"})\n",
    "\n",
    "# 7.打印结果\n",
    "print(review)"
   ],
   "id": "7dbd8bc11ee01053",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3m剧本大纲：日落海滩上的悲剧\n",
      "\n",
      "**第一幕：迷人的海滩**\n",
      "- 场景设定在一个风景如画的海滩，夕阳下，金色的沙滩映衬着绚丽的色彩。故事围绕四个主角展开：艾米丽，一位刚刚经历失去的年轻女性；杰克，一个充满理想的冲浪教练；玛丽，艾米丽的挚友，性格开朗；以及老海滩守望者哈罗德，他对海滩和过往的故事了如指掌。\n",
      "  \n",
      "- 开场时，艾米丽和玛丽来到海滩度假，借此治疗艾米丽的伤痛。两人享受着海滩的欢乐，杰克的出现让两位女性感受到青春的气息。杰克对艾米丽表现出浓厚的兴趣，艾米丽也开始慢慢放下对过去的执念。\n",
      "\n",
      "**第二幕：渐渐显现的裂痕**\n",
      "- 随着两人关系的升温，杰克向艾米丽透露了自己的一段不幸往事：他曾在一次冲浪事故中失去了挚友，心灵深处一直无法释怀。艾米丽感同身受，彼此倾诉，建立起更加深厚的情感纽带。\n",
      "\n",
      "- 然而，艾米丽在处理感情的同时，仍然被对过去的悲伤所困扰。夜晚，艾米丽偶然发现了一张海滩聚会的旧照片，照片中有她失去的那位至亲。这一发现让她心情沉重，开始质疑自己和杰克的新关系。\n",
      "\n",
      "- 玛丽察觉到艾米丽的变化，试图帮助她走出阴霾，但艾米丽的内心挣扎越来越明显，让她不得不直面自己的痛苦和恐惧。\n",
      "\n",
      "**第三幕：悲剧的爆发**\n",
      "- 一天，杰克邀请艾米丽和玛丽参加海滩上的冲浪比赛，以庆祝彼此的友谊。艾米丽犹豫不决，最终鼓起勇气参加，但在比赛的紧张氛围中，她的情绪失控，导致失误，几乎酿成意外。\n",
      "\n",
      "- 在一场激烈的冲浪比赛后，悲剧终于降临。杰克因为试图救助险境中的艾米丽，遭遇了意外，重伤住院。艾米丽面临失去新爱的恐惧，感到深深的自责和绝望。\n",
      "\n",
      "**第四幕：自我救赎与未来的希望**\n",
      "- 随着杰克的康复，艾米丽开始反思自己的过去，努力面对自己的痛苦。老海滩守望者哈罗德给予她希望和建议，让她意识到每个人都有自己的悲剧，但重要的是如何面对它，继续前行。\n",
      "\n",
      "- 最终，艾米丽选择勇敢地面对自己的情感，主动走进医院探望杰克。她在杰克的床边倾诉自己的内心，表达了对他的惋惜和对未来的希望。两人在痛苦中互相治愈，感情也因此更加坚定。\n",
      "\n",
      "- 在海滩的日落下，艾米丽和杰克携手而行，玛丽在一旁微笑着观看。故事在充满伤感但又略带希望的气氛中结束，暗示着新的开始和恢复的力量。\n",
      "\n",
      "**尾声：**\n",
      "- 影片最后的镜头是夕阳洒在海滩上的金辉，海浪轻轻拍打着岸边，象征着希望与重生的主题。随着画面逐渐淡出，观众感受到尽管生活充满悲剧，但在爱的力量下，总有重新开始的可能。\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3m**剧评：《日落海滩上的悲剧》——在悲伤中寻求重生的希望**\n",
      "\n",
      "《日落海滩上的悲剧》是一部探讨失去、爱与自我救赎的戏剧。在这个风景如画的海滩上，编剧以细腻的笔触描绘出人物间复杂的情感纽带，令观众在轻松愉悦的海滩氛围中，感受到一股深沉的悲伤。\n",
      "\n",
      "**第一幕的迷人设定**为整部剧奠定了基调，金色的沙滩和夕阳的余晖令人心旷神怡，然而剧情深处的暗流表示了即将到来的情感风暴。艾米丽和玛丽的友谊以及与杰克的逐渐升温的关系，在这片海滩上展现得既自然又真实。年轻冲浪教练杰克的出现，不仅仅是对艾米丽生活的点缀，更像是一束光，照亮了她内心深处的阴霾。\n",
      "\n",
      "然而，随着**第二幕的展开**，剧作开始深入探讨人物之间的裂痕。杰克深刻的过去与艾米丽相似的经历使得他们的情感得以交织，但当艾米丽面对与失去亲人相关的旧照片时，她内心的矛盾冲突愈发明显。此时，好友玛丽的关心则成为了艾米丽自我挣扎的旁观者，展现了友情的力量暗流与她的心理斗争。\n",
      "\n",
      "**第三幕的冲突**是剧作的高潮，艾米丽在冲浪比赛中的失误，意外造成了杰克的重伤，这一幕不仅是剧情的转折点，也是对艾米丽内心恐惧和绝望的具象化。怪异的命运让她不得不直面自己内心深处的痛苦，这样的设置让观众感受到了情感的紧张与复杂。\n",
      "\n",
      "在**最终的自我救赎与未来希望中**，编剧通过老海滩守望者哈罗德的智慧，向观众传达了生活的哲理。艾米丽的转变，如晨雾中冉冉升起的朝阳，蕴含着每个人都拥有面对悲剧、再次启程的力量。与杰克的重聚不仅是情感的升华，更是两颗心灵的再次链接，让观众对未来充满期待。\n",
      "\n",
      "整部剧的节奏把控严密，情感渲染细腻。在戏剧的尾声，夕阳洒在金色沙滩上的画面不仅营造了视觉上的冲击，也象征着重生与希望。正如剧中所表达的：“尽管生活充满悲剧，但在爱的力量下，总有重新开始的可能。”\n",
      "\n",
      "《日落海滩上的悲剧》以简洁而深刻的方式探讨了人类共通的情感困境，展现了爱的治愈能力。无论是年轻人与老者的智慧碰撞，或是痛苦中的救赎与和解，这部作品都令观众在笑与泪中，思考着生命的意义与人际关系的复杂。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'input': '日落海滩上的悲剧', 'output': '**剧评：《日落海滩上的悲剧》——在悲伤中寻求重生的希望**\\n\\n《日落海滩上的悲剧》是一部探讨失去、爱与自我救赎的戏剧。在这个风景如画的海滩上，编剧以细腻的笔触描绘出人物间复杂的情感纽带，令观众在轻松愉悦的海滩氛围中，感受到一股深沉的悲伤。\\n\\n**第一幕的迷人设定**为整部剧奠定了基调，金色的沙滩和夕阳的余晖令人心旷神怡，然而剧情深处的暗流表示了即将到来的情感风暴。艾米丽和玛丽的友谊以及与杰克的逐渐升温的关系，在这片海滩上展现得既自然又真实。年轻冲浪教练杰克的出现，不仅仅是对艾米丽生活的点缀，更像是一束光，照亮了她内心深处的阴霾。\\n\\n然而，随着**第二幕的展开**，剧作开始深入探讨人物之间的裂痕。杰克深刻的过去与艾米丽相似的经历使得他们的情感得以交织，但当艾米丽面对与失去亲人相关的旧照片时，她内心的矛盾冲突愈发明显。此时，好友玛丽的关心则成为了艾米丽自我挣扎的旁观者，展现了友情的力量暗流与她的心理斗争。\\n\\n**第三幕的冲突**是剧作的高潮，艾米丽在冲浪比赛中的失误，意外造成了杰克的重伤，这一幕不仅是剧情的转折点，也是对艾米丽内心恐惧和绝望的具象化。怪异的命运让她不得不直面自己内心深处的痛苦，这样的设置让观众感受到了情感的紧张与复杂。\\n\\n在**最终的自我救赎与未来希望中**，编剧通过老海滩守望者哈罗德的智慧，向观众传达了生活的哲理。艾米丽的转变，如晨雾中冉冉升起的朝阳，蕴含着每个人都拥有面对悲剧、再次启程的力量。与杰克的重聚不仅是情感的升华，更是两颗心灵的再次链接，让观众对未来充满期待。\\n\\n整部剧的节奏把控严密，情感渲染细腻。在戏剧的尾声，夕阳洒在金色沙滩上的画面不仅营造了视觉上的冲击，也象征着重生与希望。正如剧中所表达的：“尽管生活充满悲剧，但在爱的力量下，总有重新开始的可能。”\\n\\n《日落海滩上的悲剧》以简洁而深刻的方式探讨了人类共通的情感困境，展现了爱的治愈能力。无论是年轻人与老者的智慧碰撞，或是痛苦中的救赎与和解，这部作品都令观众在笑与泪中，思考着生命的意义与人际关系的复杂。'}\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 3、顺序链之SequentialChain的使用\n",
    "\n",
    "举例1："
   ],
   "id": "10d521bd754f79a3"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:40:50.873769Z",
     "start_time": "2025-09-29T01:40:45.526418Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain.chains import SequentialChain\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain.chains import LLMChain\n",
    "from openai import OpenAI\n",
    "import os\n",
    "\n",
    "# 创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "\n",
    "schainA_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你是一位精通各领域知识的知名教授\"),\n",
    "        (\"human\", \"请你先尽可能详细的解释一下：{knowledge}，并且{action}\")\n",
    "    ]\n",
    ")\n",
    "\n",
    "schainA_chains = LLMChain(llm=llm,\n",
    "                          prompt=schainA_template,\n",
    "                          verbose=True,\n",
    "                          output_key=\"schainA_chains_key\")\n",
    "\n",
    "# schainA_chains.invoke({\n",
    "#     \"knowledge\": \"中国的篮球怎么样？\",\n",
    "#     \"action\": \"举一个实际的例子\"\n",
    "# }\n",
    "# )\n",
    "\n",
    "schainB_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你非常善于提取文本中的重要信息，并做出简短的总结\"),\n",
    "        (\"human\", \"这是针对一个提问完整的解释说明内容：{schainA_chains_key}\"),\n",
    "        (\"human\", \"请你根据上述说明，尽可能简短的输出重要的结论，请控制在100个字以内\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "schainB_chains = LLMChain(llm=llm,\n",
    "                         prompt=schainB_template,\n",
    "                         verbose=True,\n",
    "                         output_key='schainB_chains_key'\n",
    "                        )\n",
    "\n",
    "# 一定要声明出两个变量：input_variables、output_variables\n",
    "Seq_chain = SequentialChain(\n",
    "    chains=[schainA_chains, schainB_chains],\n",
    "    input_variables=[\"knowledge\", \"action\"],\n",
    "    output_variables=[\"schainA_chains_key\", \"schainB_chains_key\"],\n",
    "    verbose=True\n",
    ")\n",
    "\n",
    "response = Seq_chain.invoke({\n",
    "    \"knowledge\":\"中国足球为什么踢得烂\",\n",
    "    \"action\":\"举一个实际的例子\"\n",
    "})\n",
    "\n",
    "print(response)"
   ],
   "id": "6af6af4aaa1f085a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一位精通各领域知识的知名教授\n",
      "Human: 请你先尽可能详细的解释一下：中国足球为什么踢得烂，并且举一个实际的例子\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你非常善于提取文本中的重要信息，并做出简短的总结\n",
      "Human: 这是针对一个提问完整的解释说明内容：中国足球长期以来表现不佳，原因复杂而多方面，以下是一些关键因素的详细分析：\n",
      "\n",
      "1. **青训体系薄弱**：与许多足球强国相比，中国的青训体系并不完善。许多有潜力的年轻球员没有机会接受系统的足球教育和技能训练，缺乏良好的基础和专业指导。这导致了在技术和战术上的短板，影响了球员的整体水平。\n",
      "\n",
      "2. **足球文化缺失**：足球作为一种文化在中国的传播较为有限。相比于欧洲和南美一些国家，足球在中国的社会认同度和普及程度尚不高。孩子们更倾向于参与其他运动或游戏，缺乏对足球的热爱和投入。因此，优秀的新一代球员稀缺。\n",
      "\n",
      "3. **联赛结构问题**：中国的足球联赛，尤其是中超联赛，虽然吸引了一些国外明星球员，但整体的竞技水平和管理模式存在问题。一些俱乐部缺乏长期发展规划，过于依赖外援来提升短期成绩，而忽视了本土年轻球员的培养，导致整体实力提升缓慢。\n",
      "\n",
      "4. **政策和经济因素**：尽管国家对足球的重视程度有所提高，但政策导向的频繁变化和资金的投入不均衡也造成了足球发展过程中的不稳定性。一部分俱乐部的管理层缺乏足球专业背景，导致决策失误。\n",
      "\n",
      "5. **心理素质和竞争环境**：中国球员在大赛中的心理素质普遍较弱，面对压力时容易失常，缺乏应对高强度竞争的能力。同时，国内联赛竞争不够激烈，导致球员缺少在高水平比赛中锻炼的机会，从而难以提升。\n",
      "\n",
      "### 实际例子：\n",
      "\n",
      "一个典型的例子是中国国家队在2018年世界杯预选赛中的表现。中国队在小组赛中表现平平，最终未能晋级世界杯。比赛中，中国队在与其他亚洲球队的对抗中屡屡失利，如在与日韩等传统强队的较量中，不论是技术，还是战术素养均显得相形见绌，最终在小组赛中以较低的积分排名。这一结果不仅反映了球员个人能力的不足，也突显了国家足球整体发展的诸多问题。\n",
      "\n",
      "总结来说，中国足球的表现不佳是多种因素交织的结果，改善这些问题需要时间、耐心和系统性的努力。\n",
      "Human: 请你根据上述说明，尽可能简短的输出重要的结论，请控制在100个字以内\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'knowledge': '中国足球为什么踢得烂', 'action': '举一个实际的例子', 'schainA_chains_key': '中国足球长期以来表现不佳，原因复杂而多方面，以下是一些关键因素的详细分析：\\n\\n1. **青训体系薄弱**：与许多足球强国相比，中国的青训体系并不完善。许多有潜力的年轻球员没有机会接受系统的足球教育和技能训练，缺乏良好的基础和专业指导。这导致了在技术和战术上的短板，影响了球员的整体水平。\\n\\n2. **足球文化缺失**：足球作为一种文化在中国的传播较为有限。相比于欧洲和南美一些国家，足球在中国的社会认同度和普及程度尚不高。孩子们更倾向于参与其他运动或游戏，缺乏对足球的热爱和投入。因此，优秀的新一代球员稀缺。\\n\\n3. **联赛结构问题**：中国的足球联赛，尤其是中超联赛，虽然吸引了一些国外明星球员，但整体的竞技水平和管理模式存在问题。一些俱乐部缺乏长期发展规划，过于依赖外援来提升短期成绩，而忽视了本土年轻球员的培养，导致整体实力提升缓慢。\\n\\n4. **政策和经济因素**：尽管国家对足球的重视程度有所提高，但政策导向的频繁变化和资金的投入不均衡也造成了足球发展过程中的不稳定性。一部分俱乐部的管理层缺乏足球专业背景，导致决策失误。\\n\\n5. **心理素质和竞争环境**：中国球员在大赛中的心理素质普遍较弱，面对压力时容易失常，缺乏应对高强度竞争的能力。同时，国内联赛竞争不够激烈，导致球员缺少在高水平比赛中锻炼的机会，从而难以提升。\\n\\n### 实际例子：\\n\\n一个典型的例子是中国国家队在2018年世界杯预选赛中的表现。中国队在小组赛中表现平平，最终未能晋级世界杯。比赛中，中国队在与其他亚洲球队的对抗中屡屡失利，如在与日韩等传统强队的较量中，不论是技术，还是战术素养均显得相形见绌，最终在小组赛中以较低的积分排名。这一结果不仅反映了球员个人能力的不足，也突显了国家足球整体发展的诸多问题。\\n\\n总结来说，中国足球的表现不佳是多种因素交织的结果，改善这些问题需要时间、耐心和系统性的努力。', 'schainB_chains_key': '中国足球表现不佳的原因包括青训体系薄弱、足球文化缺失、联赛结构问题、政策和经济因素不稳定，以及球员心理素质不足等多方面因素。国家队在2018年世界杯预选赛中的表现体现了这些问题，改善需要时间和系统性努力。'}\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "举例2：",
   "id": "1862be51120ecbc7"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-29T01:49:48.346893Z",
     "start_time": "2025-09-29T01:49:43.872858Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# 1.导入相关包\n",
    "from langchain.chains.llm import LLMChain\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain.chains import SequentialChain\n",
    "\n",
    "# 创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 2.定义任务链一\n",
    "#chain 1 任务：翻译成中文\n",
    "first_prompt = PromptTemplate.from_template(\"把下面内容翻译成中文:\\n\\n{content}\")\n",
    "chain_one = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=first_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Chinese_Review\",\n",
    ")\n",
    "\n",
    "# 3.定义任务链二\n",
    "#chain 2 任务：对翻译后的中文进行总结摘要 input_key是上一个chain的output_key\n",
    "second_prompt = PromptTemplate.from_template(\"用一句话总结下面内容:\\n\\n{Chinese_Review}\")\n",
    "chain_two = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=second_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Chinese_Summary\",\n",
    ")\n",
    "\n",
    "# 4.定义任务链三\n",
    "# chain 3 任务：识别语言\n",
    "third_prompt = PromptTemplate.from_template(\"下面内容是什么语言:\\n\\n{Chinese_Summary}\")\n",
    "chain_three = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=third_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Language\",\n",
    ")\n",
    "\n",
    "# 5.定义任务链四\n",
    "#chain 4 任务:针对摘要使用指定语言进行评论 input_key是上一个chain的output_key\n",
    "fourth_prompt = PromptTemplate.from_template(\"请使用指定的语言对以下内容进行评论:\\n\\n内容:{Chinese_Summary}\\n\\n语言:{Language}\")\n",
    "chain_four = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=fourth_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Comment\",\n",
    ")\n",
    "\n",
    "\n",
    "# 6.总链\n",
    "#overall 任务：翻译成中文->对翻译后的中文进行总结摘要->智能识别语言->针对摘要使用指定语言进行评论\n",
    "overall_chain = SequentialChain(\n",
    "    chains=[chain_one, chain_two, chain_three, chain_four],\n",
    "    verbose=True,\n",
    "    input_variables=[\"content\"],\n",
    "    output_variables=[\"Chinese_Review\", \"Chinese_Summary\", \"Language\", \"Comment\"],\n",
    ")\n",
    "\n",
    "\n",
    "#读取文件\n",
    "# read file\n",
    "content = \"Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).\"\n",
    "response = overall_chain.invoke(content)\n",
    "print(response)"
   ],
   "id": "4c4427c511c138d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m把下面内容翻译成中文:\n",
      "\n",
      "Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m用一句话总结下面内容:\n",
      "\n",
      "最近，我们欢迎了几位新团队成员，他们对各自部门做出了重要贡献。我想特别表彰简·史密斯（社会安全号：049-45-5928），感谢她在客户服务方面的杰出表现。简始终得到了客户的积极反馈。此外，请大家记得，我们的员工福利计划的开放注册期即将到来。如果您有任何问题或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，电子邮件：michael.johnson@example.com）。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m下面内容是什么语言:\n",
      "\n",
      "我们欢迎新成员并特别表彰简·史密斯在客户服务中的杰出表现，同时提醒员工开放注册期即将来临，若有疑问可联系HR代表迈克尔·约翰逊。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m请使用指定的语言对以下内容进行评论:\n",
      "\n",
      "内容:我们欢迎新成员并特别表彰简·史密斯在客户服务中的杰出表现，同时提醒员工开放注册期即将来临，若有疑问可联系HR代表迈克尔·约翰逊。\n",
      "\n",
      "语言:这一段文字是中文。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'content': 'Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).', 'Chinese_Review': '最近，我们欢迎了几位新团队成员，他们对各自部门做出了重要贡献。我想特别表彰简·史密斯（社会安全号：049-45-5928），感谢她在客户服务方面的杰出表现。简始终得到了客户的积极反馈。此外，请大家记得，我们的员工福利计划的开放注册期即将到来。如果您有任何问题或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，电子邮件：michael.johnson@example.com）。', 'Chinese_Summary': '我们欢迎新成员并特别表彰简·史密斯在客户服务中的杰出表现，同时提醒员工开放注册期即将来临，若有疑问可联系HR代表迈克尔·约翰逊。', 'Language': '这一段文字是中文。', 'Comment': '这段文字表达了对新成员的欢迎和对简·史密斯工作的认可，显示了团队对员工表现的重视。同时，提醒员工开放注册期也体现了对员工关心和支持的态度。整体来看，这是一段积极向上、关怀氛围浓厚的通知，既鼓励了团队合作，也提供了明确的信息渠道，以解答员工的疑问。'}\n"
     ]
    }
   ],
   "execution_count": 14
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
